home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / SMUT.INC < prev    next >
Text File  |  1993-05-04  |  4KB  |  196 lines

  1. ;D. E. Johnson's Simple Macro-Using Translator (SMUT)
  2. ;Illustrative use of macros for easy-to-read assembly
  3.  list-
  4. ;LET dest,p0{,m1,p1,...m4,p4} (dest := expression)
  5. ;  math operations: PLUS, MINUS, TIMES, DIVBY
  6. ;INPUT p (decimal word from keyboard)
  7. ;OUTPUT p1{,p2,...p4} (decimal words, space after)
  8. ;DISPLAY 'string of chars\' ('\'=eoln)
  9. ;REPEAT (non-nestable)
  10. ;UNTIL p1,cond,expression (cond = EQ,NE,LT,GT,LE,GE)
  11. ;STOP (return to DOS)
  12. ;START = required starting label (not a macro)
  13. ;
  14. ;DS=CS & regs AX & DX are local/parameters
  15.     jmp    start    ;skip to program
  16. ;***** REPEAT ... UNTIL subroutines ****
  17. setr    pop    reta    ;set repeat addr
  18.     push    ax    ;dummy addr
  19. rpt    inc    sp    ;remove return addr
  20.     inc    sp
  21.     jmp near [reta]    ;goto start of loop
  22. reta    dw    0    ;loop addr
  23. gt    jg    rpt    ;repeat loop
  24.     retn        ;end of loop
  25. lt    jl    rpt    ;repeat loop
  26.     retn        ;end of loop
  27. eq    je    rpt    ;repeat loop
  28.     retn        ;end of loop
  29. ne    jne    rpt    ;repeat loop
  30.     retn        ;end of loop
  31. le    jle    rpt    ;repeat loop
  32.     retn        ;end of loop
  33. ge    jge    rpt    ;repeat loop
  34.     retn        ;end of loop
  35. ;**** Output subroutines **********
  36. dchar    proc    near    ;display char in AL
  37.     push    si
  38.     push    bx
  39.     push    di
  40.     push    bp
  41.     xor    bx,bx
  42.     mov    ah,14
  43.     int    16    ;bios output
  44.     pop    bp
  45.     pop    di
  46.     pop    bx
  47.     pop    si
  48.     ret
  49.   endp ;dchar
  50. outs    proc    near    ;display string
  51.     pop    ax    ;assume cs=ds
  52.     push    si
  53.     xchg    ax,si    ;si = char addr
  54.     cld
  55. slp    lodsb
  56.     test    al,al
  57.     jz    estr
  58.     cmp    al,'\'
  59.     jne    dout
  60.     mov    al,13    ;cr
  61.     call    dchar
  62.     mov    al,10    ;lf
  63. dout    call    dchar    ;display char
  64.     jmps    slp    ;next
  65. estr    pop    ax
  66.     xchg    ax,si
  67.     push    ax    ;return addr
  68.     ret
  69.   endp ;outs
  70.  
  71. ddisp    proc    near    ;decimal display
  72.     push    bx
  73.     mov    bx,10
  74.     mov    dl,-16    ;+'0' = space
  75.     push    dx    ;trailer
  76.     test    ax,ax
  77.     jns    plp
  78.     neg    ax    ;output as +
  79.     push    ax
  80.     mov    al,'-' ;negative
  81.     call    dchar
  82.     pop    ax
  83. plp    cwd        ;32-bit
  84.     idiv    bx
  85.     push    dx    ;remainder
  86.     test    ax,ax
  87.     jnz    plp
  88.     dec    bx
  89.     jns    olp
  90. olp    pop    ax
  91.     add    al,'0'
  92.     call    dchar
  93.     cmp    al,' '    ;trailer?
  94.     jnz    olp
  95.     pop    bx
  96.     ret
  97.   endp ;ddisp
  98. ;****** Input subroutine ******
  99. inax    proc    near    ;cx <-- input
  100.     push    cx
  101.     xor    cx,cx    ;word <-- 0
  102. ilp    mov    ah,0
  103.     int    22    ;al <-- char
  104.     call    dchar
  105.     cmp    al,'9'    ;valid digit?
  106.     ja    ein
  107.     sub    al,'0'
  108.     js    ein
  109.     mov    ah,0    ;AX=digit't value
  110.     xchg    ax,cx
  111.     mov    dx,10
  112.     mul    dx    ;accumulated * 10
  113.     add    cx,ax
  114.     jmps    ilp
  115. ein    xchg    ax,cx    ;AX = decimal input
  116.     pop    cx
  117.     ret
  118.    endp
  119. ;****** Equates for math ********
  120. plus    equ    1
  121. minus    equ    2
  122. times    equ    3
  123. divby    equ    4
  124. ;******** Macros *****************
  125. math    macro a,b,c,d,e,f,g,h ;AX = accumulator
  126. lx    equ    $
  127.   if a=plus
  128.         add    ax,b
  129.   elseif a=minus
  130.     sub    ax,b
  131.   elseif a=times
  132.     if type(b)=type(300) ;immediate?
  133.     mov    bp,b
  134.     imul    bp
  135.      else
  136.     imul    b    ;DX,AX = product
  137.      endif
  138.   elseif a=divby
  139.     cwd    ;DX,AX = quotient
  140.     if type(b)=type(300) ;immediate?
  141.     mov    bp,b
  142.     idiv    bp
  143.      else
  144.     idiv    b
  145.      endif
  146.   else
  147.     error 'Not a valid math operation'
  148.   endif
  149.   ifn type(c)=type() ;defined?
  150.     math c,d,e,f,g,h ;recursively
  151.   endif
  152.  endm; math
  153.  
  154. let    macro r,a,j,b,k,c,l,d,m,e
  155. ;j - m = operations, a-e = operands, r = result
  156.     mov    ax,a    ;first operand
  157.   ifn type(j)=type()    ;operation?
  158.     math    j,b,k,c,l,d,m,e
  159.   endif
  160.     mov    r,ax    ;set result
  161.   endm ;let
  162.  
  163. repeat    macro    ;set loop start point
  164.     call    setr    ;tos=loop addr
  165.  endm ;repeat
  166.  
  167. until    macro ls,ro,a,b,c,d,e,f,g,h,i
  168.     mov    ax,a    ;evaluate expression
  169.   ifn type(b)=type()
  170.     math    b,c,d,e,f,g,h,i
  171.   endif
  172.     cmp    ax,ls    ;reverse  comparison
  173.     call    ro
  174.  endm ;until
  175. ;*** I/O macros *********
  176. input    macro    inpar
  177.     call    inax
  178.     mov    inpar,ax
  179.  endm ;input
  180. output macro d1,d2,d3,d4
  181.     mov    ax,d1
  182.     call    ddisp
  183.   ifn type(d2)=type()
  184.     output d2,d3,d4
  185.   endif
  186.  endm ;output
  187. display macro strp ;string output
  188.     call    outs
  189.     db    strp,0
  190.  endm ;outstr
  191.  
  192. stop    macro ;return to DOS
  193.     retn
  194.  endm ; stop
  195.  
  196.